package websocket.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import websocket.dto.ResultList;
import websocket.entity.Ldmzjz;
import websocket.entity.dto.LdmzjzDTO;
import websocket.mapper.LdmzjzMapper;
import websocket.service.LdmzjzService;
import websocket.util.MathUtil;

import java.math.BigDecimal;
import java.util.List;

/**
 * 雷达瞄准校准数据记录接口实现
 *
 * @author nrj
 * @version v1.0
 * @since 2022-6-22 11:45:14
 */
@Service("ldmzjzService")
public class LdmzjzServiceImpl extends ServiceImpl<LdmzjzMapper, Ldmzjz> implements LdmzjzService {

    @Override
    public ResultList<LdmzjzDTO> analysis(List<LdmzjzDTO> list) {
        // 循环遍历计算得出被试设备B的真值
        list.forEach(item -> {
            // 非空校验
            if (item.getXb() == null || item.getYb() == null || item.getZb() == null) {
                return;
            }
            // 计算斜距R2
            formulaCalculationDB(item);
            // 计算高低角β2
            formulaCalculationβB(item);
            // 计算舷角q2
            formulaCalculationQB(item);
        });
        return ResultList.success(list);
    }

    /**
     * 计算斜距R2
     *
     * @param dto 计算输入原数据
     */
    public static void formulaCalculationDB(LdmzjzDTO dto) {
        Double x = dto.getXb();
        Double y = dto.getYb();
        Double z = dto.getZb();
        // 公式计算
        double sqrtDB = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2));
        dto.setXjr2(MathUtil.formatDouble(sqrtDB));
    }

    /**
     * 计算高低角β2
     *
     * @param dto 计算输入原数据
     */
    public static void formulaCalculationβB(LdmzjzDTO dto) {
        Double x = dto.getXb();
        Double y = dto.getYb();
        Double z = dto.getZb();
        // 公式计算转换角度
        double atanβB = Math.atan(z / Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))) * 180 / Math.PI;
        dto.setGdj2(MathUtil.formatDouble(atanβB));
    }

    /**
     * 计算舷角q2
     *
     * @param dto 计算输入原数据
     */
    public static void formulaCalculationQB(LdmzjzDTO dto) {
        Double x = dto.getXb();
        Double y = dto.getYb();
        // 公式计算转换角度
        double atanQB = Math.atan(x / y) * 180 / Math.PI;
        dto.setXjq2(MathUtil.formatDouble(atanQB));
    }

    @Override
    public ResultList<LdmzjzDTO> calsulationSheBeiZhi(List<LdmzjzDTO> list) {
        list.forEach(item -> {
            // 非空校验
            if (item.getXb() == null || item.getYb() == null || item.getZb() == null) {
                return;
            }
            //对真值设备度分秒转化
//            double du=90-item.getDu();
//            double du=item.getDu();
//            double fen=60-item.getFen();
//            double miao=60-item.getMiao();
//            item.setDu(du);
//            item.setFen(fen);
//            item.setMiao(miao);
//            item.setGdj1(3.5526);
            // 计算真值设备A高低角(根据：度、分、秒计算得出)
            this.calculationSheBeiAGdj(item);
            // 计算过程数据XB
            this.calculationGuoChengXB(item);
            // 计算过程数据YB
            this.calculationGuoChengYB(item);
            // 计算过程数据ZB
            this.calculationGuoChengZB(item);
            // 计算设备B斜距R2
            this.calculationSheBeiBXj(item);
            // 计算设备B高低角β2
            this.calculationSheBeiBGdj(item);
            // 计算设备B舷角q2
            this.calculationSheBeiBXjq2(item);
//            // 计算被测设备测量值-斜距
//            this.calculationBcsbxj(item);
//            // 计算被测设备测量值-高低角
//            this.calculationBcsbGdj(item);
//            // 计算被测设备测量值-舷角
//            this.calculationBcsbXianJiao();
            // 计算校准值-斜距
            if (null != item.getXjr2() && null != item.getBcsbXj()) {
                BigDecimal jzzxj = new BigDecimal(item.getXjr2() - item.getBcsbXj());
                item.setJzzXj(Double.valueOf(jzzxj.setScale(4, BigDecimal.ROUND_HALF_UP).toString()));
            }
            // 计算校准值-高低角
            if (null != item.getGdj2() && null != item.getBcsbGdj()) {
                BigDecimal jzzgdj = new BigDecimal(item.getGdj2() - item.getBcsbGdj());
                item.setJzzGdj(Double.valueOf(jzzgdj.setScale(4, BigDecimal.ROUND_HALF_UP).toString()));
            }
            // 计算校准值-舷角
            if (null != item.getXjq2() && null != item.getBcsbXianJiao()) {
                BigDecimal jzzxianJiao = new BigDecimal(item.getXjq2() - item.getBcsbXianJiao());
                item.setJzzXianJiao(Double.valueOf(jzzxianJiao.setScale(4, BigDecimal.ROUND_HALF_UP).toString()));
            }



            //真值设备初始值回填
            //对真值设备度分秒转化
//            du=90-item.getDu();
//            du=item.getDu();
//            fen=60-item.getFen();
//            miao=60-item.getMiao();
//            item.setDu(du);
//            item.setFen(fen);
//            item.setMiao(miao);

        });
        return ResultList.success(list);
    }


    /**
     * 计算设备B舷角q2
     *
     * @param item
     */
    private void calculationSheBeiBXjq2(LdmzjzDTO item) {
        // 过程数据XB
        Double gcxb = item.getGcxb();
        // 过程数据YB
        Double gcyb = item.getGcyb();

        double shuJuM3 = 0;
        if (gcxb < 0) {
            shuJuM3 = Math.toDegrees(Math.atan(gcyb / gcxb)) + 180;
        } else {
            shuJuM3 = Math.toDegrees(Math.atan(gcyb / gcxb));
        }
        BigDecimal bigDecimal = new BigDecimal(shuJuM3).setScale(4, BigDecimal.ROUND_HALF_UP);
        shuJuM3 = Double.valueOf(bigDecimal.toString());
        if (shuJuM3 > 180) {
            item.setXjq2(shuJuM3 - 360);
        } else {
            item.setXjq2(shuJuM3);
        }
    }

    /**
     * 计算设备B高低角β2
     *
     * @param item
     */
    private void calculationSheBeiBGdj(LdmzjzDTO item) {
        // 过程数据XB
        Double gcxb = item.getGcxb();
        // 过程数据YB
        Double gcyb = item.getGcyb();
        // 过程数据ZB
        Double gczb = item.getGczb();
        double v = Math.toDegrees(Math.atan(gczb / Math.sqrt(gcxb * gcxb + gcyb * gcyb)));
        BigDecimal bigDecimal = new BigDecimal(v).setScale(4, BigDecimal.ROUND_HALF_UP);
        item.setGdj2(Double.valueOf(bigDecimal.toString()));

    }

    /**
     * 计算设备B斜距R2
     *
     * @param item
     */
    private void calculationSheBeiBXj(LdmzjzDTO item) {
        // 过程数据XB
        Double gcxb = item.getGcxb();
        // 过程数据YB
        Double gcyb = item.getGcyb();
        // 过程数据ZB
        Double gczb = item.getGczb();

        double sqrt = Math.sqrt(gcxb * gcxb + gcyb * gcyb + gczb * gczb);
        BigDecimal bigDecimal = new BigDecimal(sqrt).setScale(4, BigDecimal.ROUND_HALF_UP);
        item.setXjr2(Double.valueOf(bigDecimal.toString()));
    }

    /**
     * 计算过程数据ZB
     */
    private void calculationGuoChengZB(LdmzjzDTO item) {
        // 斜距R1(m)
        Double xjr1 = item.getXjr1();
        // 高低角β1
        Double gdj1 = item.getGdj1();
        // Zb(m)
        Double zb = item.getZb();
        double guoChengZb = xjr1 * Math.sin(Math.toRadians(gdj1)) - zb;
        BigDecimal bigDecimal = new BigDecimal(guoChengZb).setScale(4, BigDecimal.ROUND_HALF_UP);
        item.setGczb(Double.valueOf(bigDecimal.toString()));
    }

    /**
     * 计算过程数据YB
     */
    private void calculationGuoChengYB(LdmzjzDTO item) {
        // 斜距R1(m)
        Double xjr1 = item.getXjr1();
        // 高低角β1
        Double gdj1 = item.getGdj1();
        // 舷角q1
        Double xjq1 = item.getXjq1();
        // Yb(m)
        Double yb = item.getYb();
        double guoChengYb = xjr1 * Math.cos(Math.toRadians(gdj1)) * Math.sin(Math.toRadians(xjq1)) - yb;
        BigDecimal bigDecimal = new BigDecimal(guoChengYb).setScale(4, BigDecimal.ROUND_HALF_UP);
        item.setGcyb(Double.valueOf(bigDecimal.toString()));
    }

    /**
     * 计算过程数据XB
     */
    private void calculationGuoChengXB(LdmzjzDTO item) {
        // 斜距R1(m)
        Double xjr1 = item.getXjr1();
        // 高低角β1
        Double gdj1 = item.getGdj1();
        // 舷角q1
        Double xjq1 = item.getXjq1();
        // Xb(m)
        Double xb = item.getXb();
        double guoChengXb = xjr1 * Math.cos(Math.toRadians(gdj1)) * Math.cos(Math.toRadians(xjq1)) - xb;
        BigDecimal bigDecimal = new BigDecimal(guoChengXb).setScale(4, BigDecimal.ROUND_HALF_UP);
        item.setGcxb(Double.valueOf(bigDecimal.toString()));
    }

    /**
     * 计算真值设备A高低角(根据：度、分、秒计算得出)
     *
     * @param item
     */
    private void calculationSheBeiAGdj(LdmzjzDTO item) {
        // 度
        Double du = item.getDu();
        // 分
        Double fen = item.getFen();
        // 秒
        Double miao = item.getMiao();

        BigDecimal round = new BigDecimal((miao / 60 + fen) / 60 + Math.abs(du));
        BigDecimal bigDecimal = round.setScale(8, BigDecimal.ROUND_HALF_UP);
        System.err.println("高低角1：" + bigDecimal);
        item.setGdj1(Double.valueOf(bigDecimal.toString()));

    }

    public static void main(String[] args) {
        LdmzjzDTO item = new LdmzjzDTO();
//        ldmzjzDTO.setDu(-25.0);
//        ldmzjzDTO.setMiao(25.0);
//        ldmzjzDTO.setFen(25.0);
        item.setXjr1(6000.0);
        item.setGdj1(5.0);
        item.setXjq1(39.0);
        item.setXb(10.0);
        item.setYb(20.0);
        item.setZb(5.0);

        item.setBcsbXj(1.0);
        item.setBcsbGdj(1.0);
        item.setBcsbXianJiao(1.0);

        // 计算真值设备A高低角(根据：度、分、秒计算得出)
//        new LdmzjzServiceImpl().calculationSheBeiAGdj(item);
        // 计算过程数据XB
        new LdmzjzServiceImpl().calculationGuoChengXB(item);
        // 计算过程数据YB
        new LdmzjzServiceImpl().calculationGuoChengYB(item);
        // 计算过程数据ZB
        new LdmzjzServiceImpl().calculationGuoChengZB(item);
        // 计算设备B斜距R2
        new LdmzjzServiceImpl().calculationSheBeiBXj(item);
        // 计算设备B高低角β2
        new LdmzjzServiceImpl().calculationSheBeiBGdj(item);
        // 计算设备B舷角q2
        new LdmzjzServiceImpl().calculationSheBeiBXjq2(item);
//            // 计算被测设备测量值-斜距
//            this.calculationBcsbxj(item);
//            // 计算被测设备测量值-高低角
//            this.calculationBcsbGdj(item);
//            // 计算被测设备测量值-舷角
//            this.calculationBcsbXianJiao();
        // 计算校准值-斜距
        BigDecimal jzzxj = new BigDecimal(item.getXjr2() - item.getBcsbXj());
        item.setJzzXj(Double.valueOf(jzzxj.setScale(4, BigDecimal.ROUND_HALF_UP).toString()));
        // 计算校准值-高低角
        BigDecimal jzzgdj = new BigDecimal(item.getGdj2() - item.getBcsbGdj());
        item.setJzzGdj(Double.valueOf(jzzgdj.setScale(4, BigDecimal.ROUND_HALF_UP).toString()));
        // 计算校准值-舷角
        BigDecimal jzzxianJiao = new BigDecimal(item.getXjq2() - item.getBcsbXianJiao());
        item.setJzzXianJiao(Double.valueOf(jzzxianJiao.setScale(4, BigDecimal.ROUND_HALF_UP).toString()));
//        ldmzjzDTO.setGcxb(4635.1321);
//        ldmzjzDTO.setGcyb(3741.5538);
//        ldmzjzDTO.setGczb(517.93446);
//        new LdmzjzServiceImpl().calculationSheBeiAGdj(ldmzjzDTO);
//        System.err.println(ldmzjzDTO.getGdj1());
//        new LdmzjzServiceImpl().calculationGuoChengXB(ldmzjzDTO);
//        System.err.println(ldmzjzDTO.getGcxb());
//        new LdmzjzServiceImpl().calculationSheBeiBXj(ldmzjzDTO);
//        System.err.println(ldmzjzDTO.getXjr2());

        System.err.println(item.toString());
    }
}
